#ifndef __MY_USER__
#define __MY_USER__
#include "Util.h"
#include "Data.h"
#include <mysql/mysql.h>
#include <string>
#include <mutex>

namespace aod {
    class TableUser {
        public:
            TableUser() {
                _mysql = MysqlInit();
                if(_mysql == NULL) {
                    exit(-1);
                }
            }
            ~TableUser() {
                MysqlDestory(_mysql);
            }

            // 用户注册
            bool Register(const std::string& username, const std::string& password, const std::string& email);
            
            // 用户登录验证
            bool Login(const std::string& username, const std::string& password, Json::Value* user_info);
            
            // 获取用户信息
            bool GetUserById(int user_id, Json::Value* user_info);
            bool GetUserByUsername(const std::string& username, Json::Value* user_info);
            
            // 更新用户信息
            bool UpdateUser(int user_id, const Json::Value& user_data);
            
            // 检查用户名是否存在
            bool UsernameExists(const std::string& username);
            
            // 检查邮箱是否存在
            bool EmailExists(const std::string& email);

        private:
            MYSQL* _mysql;
            std::mutex _mtx;
            
            // 密码加密
            std::string HashPassword(const std::string& password);
            bool VerifyPassword(const std::string& password, const std::string& hash);
    };

    class TableUserSession {
        public:
            TableUserSession() {
                _mysql = MysqlInit();
                if(_mysql == NULL) {
                    exit(-1);
                }
            }
            ~TableUserSession() {
                MysqlDestory(_mysql);
            }

            // 创建会话
            bool CreateSession(int user_id, std::string* session_id, std::string* expires_at);
            
            // 验证会话
            bool ValidateSession(const std::string& session_id, Json::Value* user_info);
            
            // 删除会话（登出）
            bool DeleteSession(const std::string& session_id);
            
            // 刷新会话
            bool RefreshSession(const std::string& session_id, std::string* new_expires_at);
            
            // 清理过期会话
            bool CleanExpiredSessions();

        private:
            MYSQL* _mysql;
            std::mutex _mtx;
            
            // 生成随机会话ID
            std::string GenerateSessionId();
    };

    class TableVideoLikes {
        public:
            TableVideoLikes() {
                _mysql = MysqlInit();
                if(_mysql == NULL) {
                    exit(-1);
                }
            }
            ~TableVideoLikes() {
                MysqlDestory(_mysql);
            }

            // 点赞/取消点赞
            bool LikeVideo(int video_id, int user_id, bool like);
            
            // 检查用户对视频的点赞状态
            bool GetLikeStatus(int video_id, int user_id, bool* liked);
            
            // 获取视频点赞总数（基于点赞表计算）
            bool GetVideoLikeCount(int video_id, int* like_count);

        private:
            MYSQL* _mysql;
            std::mutex _mtx;
    };
}

#endif 